/**
 *
 *  ALGORITMOS Y ESTRUCTURA DE DATOS
 * HOJA DE TRABAJO 7 
 * YUCELY BEB 12537
 * VICTOR FUENTES 12298
 * 
 * CLASE PARA USARSE COMO ARBOL BINARIO
 */

public class Arbol <E>{
    //atributos
    E valor;
    
    Arbol<E> padre;
    
    Arbol<E> izquierda;
    
    Arbol<E> derecha;
    
    public Arbol(){
        derecha=null; padre=null; valor=null; izquierda=null;
    }
    
    //contruccion de arbol segun valor
    public Arbol(E vall){
        valor=vall;
        derecha=new Arbol<E>();
        izquierda =new Arbol<E>();
        izquierda=null;
        derecha=null;
    }
    
    //metodo para cambiar el padre de un arbol
    public void setPadre(Arbol<E> pad){
        padre=pad;
    }
    
    
    //metodo para cambiar nodo hijo derecho
    public void setDerecha(Arbol<E> right ){
        if(derecha!=null && derecha.getPadre()==this){
            derecha.setPadre(null);
        }else{
            derecha=right;
            derecha.setPadre(this);
        }
    }
    
    //metodo para cambiar nodo hijo izqueierdo
    public void setIzquierda(Arbol<E> left){
        if(izquierda!=null && izquierda.getPadre()==this){
            izquierda.setPadre(null);
        }else{
            izquierda=left;
            izquierda.setPadre(this);
        }
    }
    
    
    //construccion de arbol sergun valor, un nodo hijo derecho y 
    //un nodo hijo izquierdo
    public Arbol(E vall, Arbol<E> left, Arbol<E> right){
        valor=vall;
        if(left==null){
            left=new Arbol<E>();
        }else setIzquierda(left);
        
        if(right==null){
            right=new Arbol<E>();
        }else setDerecha(right);
            
    }
    
    
    //metodo para cambiar el valor 
    public void setValor(E vall){
        valor=vall;
    }
    
    //metodos para devolver los atributos
    public E getValor(){
        return valor;
    }
    
    public Arbol<E> getDerecha(){
        return derecha;
    }
    
    public Arbol<E> getIzquierda(){
        return izquierda;
    }
    
    public Arbol<E> getPadre(){
        return (this.padre);
    }
    
}
